package ru.compft.web.beans.table;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.compft.common.services.SystemService;
import ru.compft.web.WebConst;
import ru.compft.web.utils.FacesUtils;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.servlet.ServletRequest;
import java.io.Serializable;
import java.util.List;

/**
 * User: ASUS
 * Date: 02.08.12
 * Time: 21:37
 * Бин представляющий таблицу кешей системы
 * Расширяет функционал постраничника
 */
@ManagedBean(name = WebConst.CACHES_TABLE)
@ViewScoped
public class CachesTableBean extends PaginationBean implements Serializable {
    private static final long serialVersionUID = 7113586962264448868L;

    private static final Logger logger = LoggerFactory.getLogger(CachesTableBean.class);

    public CachesTableBean() {
        // Получаем количество записей на странице при создании бина
        final SystemService systemService = (SystemService) FacesUtils.getSpringBean(WebConst.SYSTEM_SERVICE);
        setRecordsPerPage(systemService.maxRecordsPerPage());
    }

//    public String changeOffers(AjaxBehaviorEvent actionEvent) {  }


    /**
     * Список кешей для вывода на текущей странице
     *
     * @return
     */
    @Override
    public List getRecords() {
        // Получаем номер страницы через Request, из его Query параметра
        final ServletRequest servletRequest = (ServletRequest) FacesUtils.getExternalContext().getRequest();
        final String pageParam = servletRequest.getParameter(PAGE_PARAM);

        if (logger.isDebugEnabled()) {
            logger.debug("Try get setting list for page = " + pageParam);
        }

        // Если параметра нет, то возвращаем 1-ю страницу.
        int currentPage = currentPageValidNumber(pageParam);

        if (logger.isDebugEnabled()) {
            logger.debug("Set current page = " + currentPage);
        }

        // устанавливаем номер страницы в бин
        setCurrentPage(currentPage);

        // получаем количество записей на странице
        final int recordsPerPage = getRecordsPerPage();

        // считаем начальный индекс - номер страницы умноженный на максимальное количество записей на странице
        // минус 1 делаем потому. что это индекс начала страницы
        final int fromIndex = (currentPage - 1) * recordsPerPage;
        return getCaches(fromIndex, recordsPerPage);
    }

    /**
     * Список заданного количества записей от определенного индекса
     *
     * @param from  - индекс начала
     * @param count - количества записей
     * @return
     */
    private List<AppCache> getCaches(int from, int count) {
        if (logger.isDebugEnabled()) {
            logger.debug("Try getting '" + count + "' caches from '" + from + "' index");
        }

        // получаем сервис работы с кешами
        final CacheService service = (CacheService) FacesUtils.getSpringBean(WebConst.CACHE_SERVICE);
        final List<AppCache> appCacheList = service.getCaches(from, count);
        final int totalRecords = service.countAllCaches();

        // анализируем общее количество страниц, чтоб их было больше чем запрошенная
        analizeTotalPage(totalRecords);

        // заполняем некоторые поля для постраничника
        fillPagebleParams(from, count, appCacheList, totalRecords);

        if (logger.isDebugEnabled()) {
            logger.debug("Was fount '" + (appCacheList != null ? appCacheList.size() : "null") + "' caches");
        }

        return appCacheList;
    }
}
